package com.the_ring.chapter08.util;

import android.graphics.Paint;
import android.text.TextUtils;
import android.view.View;
import android.view.ViewGroup;
import android.widget.LinearLayout;

public class MeasureUtil {

    // 获取指定文本的宽度（长度）
    public static float getTextWidth(String text, float textSize) {
        if (TextUtils.isEmpty(text)) {
            return 0;
        }
        Paint paint = new Paint();      // 创建一个画笔对象
        paint.setTextSize(textSize);    // 设置画笔的文本大小
        return paint.measureText(text); // 利用画笔丈量指定文本的宽度
    }

    // 获取指定文本的高度
    public static float getTextHeight(String text, float textSize) {
        Paint paint = new Paint();                      // 创建一个画笔对象
        paint.setTextSize(textSize);                    // 设置画笔的文本大小
        Paint.FontMetrics fm = paint.getFontMetrics();  // 获取画笔默认字体的度量表
        return fm.descent - fm.ascent;                  // 返回文本自身的高度
        // return fm.bottom - fm.top + fm.leading;      // 返回文本所在行高度
    }

    // 计算指定线性布局的实际高度
    public static float getRealHeight(View child) {
        LinearLayout linearLayout = (LinearLayout) child;
        // 获取线性布局的布局参数
        ViewGroup.LayoutParams params = linearLayout.getLayoutParams();
        if (params == null) {
            params = new ViewGroup.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.WRAP_CONTENT);
        }
        // 获得布局参数里面的宽度规格
        int wdSpec = ViewGroup.getChildMeasureSpec(0, 0, params.width);
        int htSpec;
        if (params.height > 0) {        // 高度大于 0，说明这是明确的 dp 数值
            // 按照精确数值的情况计算高度规格
            htSpec = View.MeasureSpec.makeMeasureSpec(params.height, View.MeasureSpec.EXACTLY);
        } else {            // math_parent 和 wrap_content
            htSpec = htSpec = View.MeasureSpec.makeMeasureSpec(0, View.MeasureSpec.UNSPECIFIED);
        }
        linearLayout.measure(wdSpec, htSpec);       // 重新丈量线性布局的宽、高
        // 获得并返回线性布局丈量之后的高度，调用 geyMeasureWidth 方法可获得宽度
        return linearLayout.getMeasuredWidth();
    }
}
